/*
 * 防抖函数使用简介
 *
 * 引入import {debounce} from "@/common/utils";
 *
 *  防抖函数的第一个参数func为需要防抖的执行方法
 *  第二个参数delay为延迟毫秒数 ms
 *   使用实例
 *   debounce((res) => {console.log(res)}, 500);
 *   上述为传入res打印，防抖时间为500ms
 * */

export function debounce(func, delay) {
  let timer = null;
  // ...传入多个参数
  return function(...args) {
    if (timer) clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(this, args);
    }, delay);
    return timer;
  };
}

//函数节流
export function throttle(fn, interval) {
  let canRun = true;
  return function(...ars) {
    if (!canRun) return;
    canRun = false;
    setTimeout(() => {
      fn.apply(this,ars);
      canRun = true;
    }, interval);
  };
}
// 日期控制使用简介
/*
 *   引入const {formatDate} = require("@/common/utils");
 *   res = formatDate(new Date(Time), 'hh:mm')
 *   Time为机器毫秒数(从几几年到现在的毫秒数)， 'hh:mm'为输出日期格式
 *   年 yyyy -> 2021 yy -> 21
 *   月 M -> 8 MM -> 08 M -> 12 MM -> 12
 *   日 d -> 8  dd -> 08 d -> 28 dd -> 28
 *   小时 与上述相同多余的会用0来补全 h
 *   分钟 与上述相同 m
 *   秒 与上述相同 s
 *
 *   中间需要使用什么符号自己写 hh:mm -> 16:47 hh-mm -> 16-47 hh.mm -> 16.47 yyyy-MM/dd:hh -> 2021-6/28:16
 *   完整使用实例：
 *   年月日显示： yyyy-MM-dd -> 2021-6-28
 *   小时到秒显示： hh:mm:ss -> 16:49:55
 *
 * */

// 正则表达式用于字符串匹配 （难，规则太多）
export function formatDate(date, fmt) {
  // 1.获取年份
  // y yy yyyy +表示有一个或多个
  // * 0个或者多个
  // ? 0个或者1个
  if (/(y+)/.test(fmt)) {
    // RegExp.$1就是匹配到的字符串
    // substr截取有几个
    fmt = fmt.replace(
      RegExp.$1,
      (date.getFullYear() + "").substr(4 - RegExp.$1.length)
    );
  }

  // 2.获取
  // M+ -> 正则表达式中的一个规则.
  //
  let o = {
    "M+": date.getMonth() + 1,
    "d+": date.getDate(),
    "h+": date.getHours(),
    "m+": date.getMinutes(),
    "s+": date.getSeconds()
  };
  // 为什么y和下面的不放到一起？
  // 下面
  for (let k in o) {
    if (new RegExp(`(${k})`).test(fmt)) {
      let str = o[k] + "";
      fmt = fmt.replace(
        RegExp.$1,
        RegExp.$1.length === 1 ? str : padLeftZero(str)
      );
    }
  }
  return fmt;
}

// 截取00，有0补充无零截取
function padLeftZero(str) {
  return ("00" + str).substr(str.length);
}
